#include "MC33879.h"

#include "std.h"

t_mc33879 mc33879_dev[2];

/**
 * 初始化MC33879设备控制器
 *
 * 该函数用于初始化MC33879设备控制器，配置SPI接口和GPIO引脚以用于与MC33879的通信和控制。
 *
 * @param dev 指向p_mc33879结构体的指针，用于存储设备控制器的配置信息。
 * @param chan 指定使用的通道号。
 * @param spix 指向SPI_HandleTypeDef结构体的指针，用于配置SPI总线接口。
 * @param gpio_cs 指向GPIO_TypeDef结构体的指针，用于配置CS（Chip Select）控制的GPIO端口。
 * @param gpio_pin_cs 指定CS控制信号使用的GPIO引脚。
 * @param cs_valid 指定CS信号的有效状态。
 * @param gpio_en 指向GPIO_TypeDef结构体的指针，用于配置EN（Enable）控制的GPIO端口。
 * @param gpio_pin_en 指定EN控制信号使用的GPIO引脚。
 * @param en_valid 指定EN信号的有效状态。
 */
void mc33879_init(p_mc33879 dev, uint8_t chan, SPI_HandleTypeDef *spix, GPIO_TypeDef *gpio_cs, uint16_t gpio_pin_cs, GPIO_PinState cs_valid, GPIO_TypeDef *gpio_en, uint16_t gpio_pin_en, GPIO_PinState en_valid)
{
    // 初始化设备控制器的配置结构体
    dev->chan = chan;

    dev->spix = spix;

    dev->gpio_cs = gpio_cs;
    dev->gpio_pin_cs = gpio_pin_cs;
    dev->cs_valid = cs_valid;

    dev->gpio_en = gpio_en;
    dev->gpio_pin_en = gpio_pin_en;
    dev->en_valid = en_valid;

    // 配置并输出EN控制信号的初始状态
    HAL_GPIO_WritePin(dev->gpio_en, dev->gpio_pin_en, dev->en_valid);
}

int mc33879_rw(p_mc33879 dev, uint16_t txdata)
{
    int tmp;
    uint8_t tx_buf[6], rx_buf[6];
    //    HAL_GPIO_WritePin(dev->gpio_en,dev->gpio_pin_en,dev->en_valid);
    HAL_GPIO_WritePin(dev->gpio_cs, dev->gpio_pin_cs, dev->cs_valid);

    tx_buf[0] = 0x11;
    tx_buf[1] = 0x22;
    tx_buf[2] = txdata >> 8;
    tx_buf[3] = txdata & 0xff;
    tmp = HAL_SPI_TransmitReceive(dev->spix, tx_buf, rx_buf, 4, 1000);
    if (tmp == HAL_OK)
    {
        dev->out.data = txdata;
        dev->fault.data = (rx_buf[0] << 8) | rx_buf[1];
    }
    /* mc33879通讯正常则可以回显 */
    if ((rx_buf[2] == tx_buf[0]) && (rx_buf[3] == tx_buf[1]))
    {
        dev->err = 0;
    }
    else
    {
        dev->err = 1;
    }

    HAL_GPIO_WritePin(dev->gpio_cs, dev->gpio_pin_cs, (GPIO_PinState)(!(dev->cs_valid)));
    //    HAL_GPIO_WritePin(dev->gpio_en,dev->gpio_pin_en,(GPIO_PinState)(!(dev->en_valid)));

    return tmp;
}
uint8_t test_rx_buf[10];
int test_mc33879_rw(p_mc33879 dev)
{
    int tmp;
    uint8_t tx_buf[6], rx_buf[6];
    HAL_GPIO_WritePin(dev->gpio_cs, dev->gpio_pin_cs, dev->cs_valid);

    tx_buf[0] = 0x11;
    tx_buf[1] = 0x22;
    tx_buf[2] = 0x33;
    tx_buf[3] = 0x44;
    tx_buf[4] = 0x55;
    tx_buf[5] = 0x66;
    tmp = HAL_SPI_TransmitReceive(dev->spix, tx_buf, rx_buf, 6, 1000);
    if (tmp == HAL_OK)
    {
        //        dev->out.data = txdata;
        dev->fault.data = (rx_buf[0] << 8) | rx_buf[1];
    }

    HAL_GPIO_WritePin(dev->gpio_cs, dev->gpio_pin_cs, (GPIO_PinState)(!(dev->cs_valid)));

    printf("%02x,%02x,%02x,%02x,%02x,%02x\r\n", rx_buf[0], rx_buf[1], rx_buf[2], rx_buf[3], rx_buf[4], rx_buf[5]);

    return tmp;
}
